home *** CD-ROM | disk | FTP | other *** search
/ Developer CD Series 1997 January: Mac OS SDK / Dev.CD Jan 97 SDK2.toast / Development Kits (Disc 2) / OpenDoc / OpenDoc Development / Debugging Support / OpenDoc™ Source Code / UI / Arbitrat.cpp next >
Encoding:
C/C++ Source or Header  |  1996-08-28  |  13.6 KB  |  561 lines  |  [TEXT/MPS ]

  1. /*
  2.     File:        Arbitrat.cpp
  3.  
  4.     Contains:    Implementation of class ODArbitrator, which arbitrates foci.
  5.  
  6.     Owned by:    Richard Rodseth
  7.  
  8.     Copyright:    © 1994 - 1995 by Apple Computer, Inc., all rights reserved.
  9.  
  10.     Change History (most recent first):
  11.  
  12.         <14>     10/8/95    TJ        Fixes Recomended by Refball
  13.         <13>      8/3/95    RR        #1257260: Collapse B classes. Remove
  14.                                     somInit methods. Don't call IsInitialized
  15.                                     or SubclassResponsibility
  16.         <12>     5/26/95    RR        #1251403: Multithreading naming support
  17.         <11>     5/25/95    jpa        Fixed 'for' loop for ANSI compliance.
  18.                                     [1253324]
  19.         <10>     4/13/95    RR        # 1216618 Added ODVolatile
  20.          <9>      4/7/95    RR        #1216618 Added SOM_TRY etc.
  21.          <8>    10/18/94    RR        Removed unused private BRF, CRF, ARF
  22.                                     methods. Moved selection focus management
  23.                                     to focus module. Removed assumptions about
  24.                                     exclusivity by delegating to focus module
  25.                                     in more places.
  26.          <7>      9/2/94    RR        #1184275 Pass transferringFrame and
  27.                                     newOwner to focusModule::TransferFocus
  28.          <6>      9/1/94    CC        RADAR #1181971 - missing factory methods
  29.                                     (for JBS)
  30.          <5>     8/23/94    RR        Move Ref counting into focus module
  31.          <4>     8/17/94    jpa        Call DeleteSOMValues on fFocusModules since
  32.                                     they're SOM objects [1181531]
  33.          <3>     6/15/94    RR        Added function prefix
  34.          <2>     6/10/94    RR        Update #ifndefs
  35.          <1>     6/10/94    RR        first checked in
  36.  
  37.     To Do:
  38.     In Progress:
  39.         
  40. */
  41.  
  42.  
  43. /*
  44.  *  This file was generated by the SOM Compiler.
  45.  *  Generated using:
  46.  *     SOM incremental update: somc/smmain.c
  47.  */
  48.  
  49.  
  50. #define ODArbitrator_Class_Source
  51.  
  52. #define VARIABLE_MACROS
  53.  
  54. #include <Arbitrat.xih>
  55.  
  56. #ifndef _EXCEPT_
  57. #include "Except.h"
  58. #endif
  59.  
  60. #ifndef _DICTLIST_
  61. #include "DictList.h"
  62. #endif
  63.  
  64. #ifndef SOM_Module_OpenDoc_Foci_defined
  65. #include "Foci.xh"
  66. #endif
  67.  
  68. #ifndef SOM_ODFocusSet_xh
  69. #include "FocusSet.xh"
  70. #endif
  71.  
  72. #ifndef SOM_ODFocusSetIterator_xh
  73. #include "FocusItr.xh"
  74. #endif
  75.  
  76. #ifndef SOM_ODFocusModule_xh
  77. #include "FocusMod.xh"
  78. #endif
  79.  
  80. #ifndef SOM_ODExclusiveFocusModule_xh
  81. #include "ExcFocus.xh"
  82. #endif
  83.  
  84. #ifndef _ODSESSN_
  85. #include "ODSessn.xh"
  86. #endif
  87.  
  88. #ifndef SOM_ODPart_xh
  89. #include "Part.xh"
  90. #endif
  91.  
  92. #ifndef SOM_ODFrame_xh
  93. #include "Frame.xh"
  94. #endif
  95.  
  96. SOM_Scope ODBoolean  SOMLINK ODArbitratorRequestFocusSet(ODArbitrator *somSelf, Environment *ev,
  97.         ODFocusSet* focusSet,
  98.         ODFrame* requestingFrame)
  99. {
  100.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  101.     ODArbitratorMethodDebug("ODArbitrator","RequestFocusSet");
  102.  
  103.     ODFocusSetIterator* iter = kODNULL; ODVolatile(iter);
  104.     ODBoolean allRegistered = kODTrue;
  105.     ODBoolean allWilling = kODTrue;
  106.     ODTypeToken lastFocus;
  107.     ODBoolean success = kODFalse;
  108.     
  109.     SOM_TRY
  110.  
  111.         iter = focusSet->CreateIterator(ev);
  112.         
  113.         // First check if any foci are not registered
  114.         ODTypeToken focus;
  115.         for (focus = iter->First(ev); allRegistered && iter->IsNotComplete(ev);focus = iter->Next(ev))
  116.         {
  117.             allRegistered = somSelf->GetFocusModule(ev,focus) && allRegistered;
  118.         }
  119.         if (!allRegistered)
  120.             THROW(kODErrFocusNotRegistered);
  121.         
  122.         // Now check if existing owners are willing to relinquish each focus
  123.         // Non-exclusive foci aren't checked
  124.         
  125.         for (focus = iter->First(ev); allWilling && iter->IsNotComplete(ev);focus = iter->Next(ev))
  126.         {
  127.             ODFocusModule* focusModule = somSelf->GetFocusModule(ev,focus);
  128.             
  129.             if (focusModule && (!focusModule->BeginRelinquishFocus(ev,focus, requestingFrame)))
  130.                 allWilling = kODFalse;
  131.             
  132.             lastFocus = focus;
  133.         }
  134.     
  135.         // Now commit or abort all requests
  136.         
  137.         if (allWilling)
  138.         {
  139.             for (ODTypeToken focus = iter->First(ev); iter->IsNotComplete(ev);focus = iter->Next(ev))
  140.             {
  141.                 ODFocusModule* focusModule = somSelf->GetFocusModule(ev, focus);
  142.                 
  143.                 focusModule->CommitRelinquishFocus(ev, focus, requestingFrame);
  144.                 focusModule->SetFocusOwnership(ev, focus, requestingFrame);
  145.                 
  146.             }
  147.             success = kODTrue;
  148.         }
  149.         else
  150.         {
  151.             for (ODTypeToken focus = iter->First(ev); (focus != lastFocus) && iter->IsNotComplete(ev);focus = iter->Next(ev))
  152.             {
  153.                 ODFocusModule* focusModule = somSelf->GetFocusModule(ev, focus);
  154.                     
  155.                 focusModule->AbortRelinquishFocus(ev, focus, requestingFrame);
  156.             }
  157.             success = kODFalse;
  158.         }    
  159.         ODDeleteObject(iter);
  160.         
  161.     SOM_CATCH_ALL
  162.     
  163.         ODDeleteObject(iter);
  164.             
  165.     SOM_ENDTRY
  166.     
  167.     return success;
  168. }
  169.  
  170. SOM_Scope ODBoolean  SOMLINK ODArbitratorRequestFocus(ODArbitrator *somSelf, Environment *ev,
  171.         ODTypeToken focus,
  172.         ODFrame* requestingFrame)
  173. {
  174.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  175.     ODArbitratorMethodDebug("ODArbitrator","RequestFocus");
  176.     
  177.     ODBoolean succeeded = kODFalse;
  178.  
  179.     SOM_TRY
  180.     
  181.         ODFocusModule* focusModule = somSelf->GetFocusModule(ev,focus);
  182.         
  183.         if (focusModule)
  184.         {
  185.             succeeded = focusModule->BeginRelinquishFocus(ev, focus, requestingFrame);
  186.             if (succeeded)
  187.             {
  188.                 focusModule->CommitRelinquishFocus(ev, focus, requestingFrame);
  189.                 focusModule->SetFocusOwnership(ev, focus, requestingFrame);
  190.             }
  191.             else    
  192.                 focusModule->AbortRelinquishFocus(ev, focus, requestingFrame);
  193.         }
  194.         else
  195.         {
  196.             succeeded = kODFalse;
  197.             THROW(kODErrFocusNotRegistered);
  198.         }
  199.  
  200.     SOM_CATCH_ALL
  201.     
  202.         succeeded = kODFalse;
  203.             
  204.     SOM_ENDTRY
  205.     
  206.     return succeeded;
  207. }
  208.  
  209. SOM_Scope void  SOMLINK ODArbitratorRelinquishFocusSet(ODArbitrator *somSelf, Environment *ev,
  210.         ODFocusSet* focusSet,
  211.         ODFrame* relinquishingFrame)
  212. {
  213.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  214.     ODArbitratorMethodDebug("ODArbitrator","RelinquishFocusSet");
  215.  
  216.     ODFocusSetIterator* iter = kODNULL; ODVolatile(iter);
  217.     
  218.     SOM_TRY
  219.     
  220.         iter = focusSet->CreateIterator(ev);
  221.     
  222.         for (ODTypeToken focus = iter->First(ev); iter->IsNotComplete(ev);focus = iter->Next(ev))
  223.         {
  224.     
  225.             ODFocusModule* focusModule = somSelf->GetFocusModule(ev,focus);
  226.             
  227.             if (focusModule)
  228.             {
  229.                 focusModule->UnsetFocusOwnership(ev, focus, relinquishingFrame);
  230.             }
  231.             else
  232.                 THROW(kODErrFocusNotRegistered);
  233.         }
  234.         ODDeleteObject(iter);
  235.         
  236.     SOM_CATCH_ALL
  237.     
  238.         ODDeleteObject(iter);
  239.         
  240.     SOM_ENDTRY
  241. }
  242.  
  243. SOM_Scope void  SOMLINK ODArbitratorRelinquishFocus(ODArbitrator *somSelf, Environment *ev,
  244.         ODTypeToken focus,
  245.         ODFrame* relinquishingFrame)
  246. {
  247.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  248.     ODArbitratorMethodDebug("ODArbitrator","RelinquishFocus");
  249.  
  250.     SOM_TRY
  251.  
  252.         ODFocusModule* focusModule = somSelf->GetFocusModule(ev, focus);
  253.         
  254.         if (focusModule)
  255.         {
  256.             focusModule->UnsetFocusOwnership(ev, focus, relinquishingFrame);
  257.         }
  258.         else
  259.             THROW(kODErrFocusNotRegistered);
  260.  
  261.     SOM_CATCH_ALL
  262.     SOM_ENDTRY
  263. }
  264.  
  265. SOM_Scope void  SOMLINK ODArbitratorTransferFocus(ODArbitrator *somSelf, Environment *ev,
  266.         ODTypeToken focus,
  267.         ODFrame* transferringFrame,
  268.         ODFrame* newOwner)
  269. {
  270.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  271.     ODArbitratorMethodDebug("ODArbitrator","TransferFocus");
  272.  
  273.     SOM_TRY
  274.  
  275.         ODFocusModule* focusModule = somSelf->GetFocusModule(ev, focus);
  276.         if (focusModule)
  277.             focusModule->TransferFocusOwnership(ev, focus,transferringFrame, newOwner);
  278.  
  279.     SOM_CATCH_ALL
  280.     SOM_ENDTRY
  281. }
  282.  
  283. SOM_Scope void  SOMLINK ODArbitratorTransferFocusSet(ODArbitrator *somSelf, Environment *ev,
  284.         ODFocusSet* focusSet,
  285.         ODFrame* transferringFrame,
  286.         ODFrame* newOwner)
  287. {
  288.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  289.     ODArbitratorMethodDebug("ODArbitrator","TransferFocusSet");
  290.  
  291.     ODFocusModule* focusModule = kODNULL;
  292.     ODFocusSetIterator* iter = kODNULL; ODVolatile(iter);
  293.  
  294.     SOM_TRY
  295.     
  296.         iter = focusSet->CreateIterator(ev);
  297.     
  298.         for (ODTypeToken focus = iter->First(ev); iter->IsNotComplete(ev);focus = iter->Next(ev))
  299.         {
  300.             focusModule = somSelf->GetFocusModule(ev, focus);
  301.             if (focusModule)
  302.                 focusModule->TransferFocusOwnership(ev, focus,transferringFrame, newOwner);
  303.         }
  304.         ODDeleteObject(iter);
  305.  
  306.     SOM_CATCH_ALL
  307.     
  308.         ODDeleteObject(iter);
  309.         
  310.     SOM_ENDTRY
  311. }
  312.  
  313. SOM_Scope ODFrame*  SOMLINK ODArbitratorAcquireFocusOwner(ODArbitrator *somSelf, Environment *ev,
  314.         ODTypeToken focus)
  315. {
  316.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  317.     ODArbitratorMethodDebug("ODArbitrator","AcquireFocusOwner");
  318.  
  319.     ODFrame* focusOwner = kODNULL;
  320.     ODFocusModule* focusModule = kODNULL;
  321.         
  322.     SOM_TRY
  323.     
  324.         focusModule = somSelf->GetFocusModule(ev, focus);
  325.         if (focusModule)
  326.             focusOwner = focusModule->AcquireFocusOwner(ev, focus);
  327.         else
  328.             focusOwner = kODNULL;
  329.         
  330.     SOM_CATCH_ALL
  331.     SOM_ENDTRY
  332.     
  333.     return focusOwner;
  334. }
  335.  
  336. SOM_Scope ODFocusOwnerIterator*  SOMLINK ODArbitratorCreateOwnerIterator(ODArbitrator *somSelf, Environment *ev,
  337.         ODTypeToken focus)
  338. {
  339.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  340.     ODArbitratorMethodDebug("ODArbitrator","CreateOwnerIterator");
  341.  
  342.     ODFocusOwnerIterator* ownerIterator = kODNULL;
  343.     ODFocusModule* focusModule = kODNULL;
  344.     
  345.     SOM_TRY
  346.  
  347.         focusModule = somSelf->GetFocusModule(ev, focus);
  348.         if (focusModule)
  349.             ownerIterator = focusModule->CreateOwnerIterator(ev, focus);
  350.         else
  351.             THROW(kODErrFocusNotRegistered);
  352.  
  353.     SOM_CATCH_ALL
  354.     SOM_ENDTRY
  355.     
  356.     return ownerIterator;
  357. }
  358.  
  359. SOM_Scope void  SOMLINK ODArbitratorRegisterFocus(ODArbitrator *somSelf, Environment *ev,
  360.         ODTypeToken focus,
  361.         ODFocusModule* focusModule)
  362. {
  363.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  364.     ODArbitratorMethodDebug("ODArbitrator","RegisterFocus");
  365.  
  366.     ODFocusModule* existingModule = kODNULL;
  367.     ODFocusModule* newModule = kODNULL; ODVolatile(newModule);
  368.  
  369.     SOM_TRY
  370.  
  371.         existingModule = (ODFocusModule*) _fFocusModules->ValueAtKey((KeyType) focus);
  372.         if (existingModule)
  373.             THROW(kODErrFocusAlreadyRegistered);
  374.         else
  375.         {
  376.             newModule = focusModule;
  377.             if (newModule == kODNULL)
  378.             {
  379.                 newModule = new ODExclusiveFocusModule();
  380.                 THROW_IF_NULL(newModule);    // new doesn't THROW for SOM objects
  381.                 ((ODExclusiveFocusModule*) newModule)->InitExclusiveFocusModule(ev, _fSession);
  382.             }
  383.     
  384.             _fFocusModules->AddPair((KeyType) focus, (ValueType) newModule);
  385.         }
  386.  
  387.     SOM_CATCH_ALL
  388.     
  389.         ODDeleteObject(newModule);
  390.         
  391.     SOM_ENDTRY
  392. }
  393.  
  394. SOM_Scope void  SOMLINK ODArbitratorUnregisterFocus(ODArbitrator *somSelf, Environment *ev,
  395.         ODTypeToken focus)
  396. {
  397.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  398.     ODArbitratorMethodDebug("ODArbitrator","UnregisterFocus");
  399.  
  400.     SOM_TRY
  401.  
  402.         if (_fFocusModules->ContainsKey((KeyType) focus))
  403.             _fFocusModules->RemoveKey((KeyType) focus);
  404.         else
  405.             THROW(kODErrFocusNotRegistered);
  406.  
  407.     SOM_CATCH_ALL
  408.     SOM_ENDTRY
  409. }
  410.  
  411. SOM_Scope ODBoolean  SOMLINK ODArbitratorIsFocusRegistered(ODArbitrator *somSelf, Environment *ev,
  412.         ODTypeToken focus)
  413. {
  414.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  415.     ODArbitratorMethodDebug("ODArbitrator","IsFocusRegistered");
  416.  
  417.     ODBoolean isRegistered = kODFalse;
  418.     
  419.     SOM_TRY
  420.  
  421.         ODFocusModule* focusModule = somSelf->GetFocusModule(ev, focus);
  422.         isRegistered = (focusModule != kODNULL);
  423.         
  424.     SOM_CATCH_ALL
  425.     SOM_ENDTRY
  426.     
  427.     return isRegistered;
  428. }
  429.  
  430. SOM_Scope ODBoolean  SOMLINK ODArbitratorIsFocusExclusive(ODArbitrator *somSelf, Environment *ev,
  431.         ODTypeToken focus)
  432. {
  433.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  434.     ODArbitratorMethodDebug("ODArbitrator","IsFocusExclusive");
  435.  
  436.     ODBoolean isExclusive = kODFalse;
  437.     ODFocusModule* focusModule = kODNULL;
  438.         
  439.     SOM_TRY
  440.  
  441.         focusModule = somSelf->GetFocusModule(ev, focus);
  442.         if (focusModule)
  443.             isExclusive = focusModule->IsFocusExclusive(ev, focus);
  444.         else
  445.             THROW(kODErrFocusNotRegistered);
  446.             
  447.     SOM_CATCH_ALL
  448.     SOM_ENDTRY
  449.     
  450.     return isExclusive;
  451. }
  452.  
  453. SOM_Scope void  SOMLINK ODArbitratorInitArbitrator(ODArbitrator *somSelf, Environment *ev,
  454.         ODSession* session)
  455. {
  456.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  457.     ODArbitratorMethodDebug("ODArbitrator","InitArbitrator");
  458.  
  459.     DictionaryList* focusModules = kODNULL; ODVolatile(focusModules);
  460.     
  461.  
  462.     SOM_TRY
  463.     
  464.         /* Moved from somInit. SOM itself sets fields to zero
  465.         _fSession = kODNULL;
  466.         _fFocusModules = kODNULL;
  467.         */
  468.         
  469.         somSelf->InitObject(ev);
  470.         _fSession = session;
  471.         focusModules = new DictionaryList(); // "new" THROWS for non-SOM objects
  472.         _fFocusModules = focusModules;
  473.         
  474.     SOM_CATCH_ALL
  475.     
  476.         ODDeleteObject(focusModules);
  477.         
  478.     SOM_ENDTRY
  479. }
  480.  
  481.  
  482. SOM_Scope ODFocusModule*  SOMLINK ODArbitratorGetFocusModule(ODArbitrator *somSelf, Environment *ev,
  483.         ODTypeToken focus)
  484. {
  485.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  486.     ODArbitratorMethodDebug("ODArbitrator","GetFocusModule");
  487.  
  488.     ODFocusModule* module = kODNULL;
  489.     
  490.     SOM_TRY
  491.     
  492.         module = (ODFocusModule*) _fFocusModules->ValueAtKey((KeyType) focus);
  493.         
  494.     SOM_CATCH_ALL
  495.     SOM_ENDTRY
  496.     
  497.     return module;
  498. }
  499.  
  500. SOM_Scope ODFocusSet*  SOMLINK ODArbitratorCreateFocusSet(ODArbitrator *somSelf, Environment *ev)
  501. {
  502.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  503.     ODArbitratorMethodDebug("ODArbitrator","CreateFocusSet");
  504.  
  505.     ODFocusSet* focusSet = kODNULL;  ODVolatile(focusSet);
  506.  
  507.      SOM_TRY
  508.             
  509.         focusSet = new ODFocusSet;
  510.         THROW_IF_NULL(focusSet);    // new doesn't THROW for SOM objects
  511.         focusSet->InitFocusSet(ev);
  512.     
  513.     SOM_CATCH_ALL
  514.     
  515.         ODDeleteObject(focusSet);
  516.         
  517.     SOM_ENDTRY
  518.     
  519.     return focusSet;
  520. }
  521.  
  522. SOM_Scope void  SOMLINK ODArbitratorsomUninit(ODArbitrator *somSelf)
  523. {
  524.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  525.     ODArbitratorMethodDebug("ODArbitrator","somUninit");
  526.  
  527.     if (_fFocusModules)
  528.     {
  529.         TRY
  530.             _fFocusModules->DeleteSOMValues(); // Delete the Focus Modules
  531.             ODDeleteObject(_fFocusModules);
  532.         CATCH_ALL
  533.             // Ignore exceptions
  534.         ENDTRY
  535.     }
  536.  
  537.     parent_somUninit(somSelf);
  538. }
  539.  
  540. SOM_Scope ODSize  SOMLINK ODArbitratorPurge(ODArbitrator *somSelf, Environment *ev,
  541.         ODSize size)
  542. {
  543.     ODArbitratorData *somThis = ODArbitratorGetData(somSelf);
  544.     ODArbitratorMethodDebug("ODArbitrator","Purge");
  545.     
  546.     ODSize purgeSize = 0; ODVolatile( purgeSize );
  547.  
  548.      SOM_TRY
  549.  
  550.             purgeSize = parent_Purge(somSelf,ev,size);
  551.             
  552.     SOM_CATCH_ALL
  553.         WARN("Error %ld trying to purge in ODArbitratorPurge",ErrorCode());
  554.         SetErrorCode(kODNoError);        // Eat the exception; Purge should not 
  555.                                         // propagate it because clients function
  556.                                         // fine whether memory was purged or not.
  557.     SOM_ENDTRY
  558.     
  559.     return purgeSize;
  560. }
  561.